package main

import (
	"encoding/json"

	"jlpay-sdk-go/pkg/jlpay/demo"
	"jlpay-sdk-go/pkg/jlpay/models"
	"jlpay-sdk-go/pkg/jlpay/services"
	"jlpay-sdk-go/pkg/jlpay/utils"
)

// 提现查询示例
func withdrawQueryDemo(clearingService *services.ClearingService) {
	// 创建提现查询请求
	request := models.NewWithdrawQueryRequest()

	// 直接使用map构建请求
	requestMap := map[string]interface{}{
		"org_no":        "123456",
		"merch_no":      "849584358120018",
		"out_settle_id": "1234567890128",
	}

	// 设置原始请求数据
	request.SetRawRequestMap(requestMap)

	// 序列化请求数据并打印
	requestJSON, _ := json.Marshal(requestMap)
	utils.Debugf("提现查询请求数据: %s", string(requestJSON))

	// 发送请求
	response, err := clearingService.QueryWithdraw(request)
	if err != nil {
		utils.Errorf("提现查询请求失败: %v", err)
		return
	}

	// 处理响应 - 使用BaseResponse接口的HandleResponse方法
	response.HandleResponse("提现查询")
}

// 提现申请示例
func withdrawApplyDemo(clearingService *services.ClearingService) {
	// 创建提现申请请求
	request := models.NewWithdrawApplyRequest()

	// 直接使用map构建请求
	requestMap := map[string]interface{}{
		"org_no":        "123456",
		"merch_no":      "849584358120018", // T0结算商户
		"amount":        "10",
		"settle_type":   "T0",
		"out_settle_id": "1234567890128",
		"notify_url":    "https://www.baidu.com",
		"postscript":    "附言",
	}

	// 设置原始请求数据
	request.SetRawRequestMap(requestMap)

	// 序列化请求数据并打印
	requestJSON, _ := json.Marshal(requestMap)
	utils.Debugf("提现申请请求数据: %s", string(requestJSON))

	// 发送请求
	response, err := clearingService.ApplyWithdraw(request)
	if err != nil {
		utils.Errorf("提现申请请求失败: %v", err)
		return
	}

	// 处理响应 - 使用BaseResponse接口的HandleResponse方法
	response.HandleResponse("提现申请")
}

// 结算资金查询示例
func accBalanceQueryDemo(clearingService *services.ClearingService) {
	// 创建结算资金查询请求
	request := models.NewAccBalanceRequest()

	// 直接使用map构建请求
	requestMap := map[string]interface{}{
		"org_no":    "123456",
		"merch_no":  "849584358120018",
		"acct_type": "01", // 账户类型
	}

	// 设置原始请求数据
	request.SetRawRequestMap(requestMap)

	// 序列化请求数据并打印
	requestJSON, _ := json.Marshal(requestMap)
	utils.Debugf("结算资金查询请求数据: %s", string(requestJSON))

	// 发送请求
	response, err := clearingService.QueryAccBalance(request)
	if err != nil {
		utils.Errorf("结算资金查询请求失败: %v", err)
		return
	}

	// 处理响应 - 使用BaseResponse接口的HandleResponse方法
	response.HandleResponse("结算资金查询")
}

// 通知消息解析示例
func msgNotifyDemo(clearingService *services.ClearingService) {
	// 构建通知数据
	notifyData := map[string]interface{}{
		"merch_no":      "84944035812S123",
		"settle_type":   "T0",
		"amount":        "2000",
		"fee_amount":    "300",
		"out_settle_id": "191912345678901894",
		"settle_id":     "411109630795649800601630",
		"postscript":    "postscript",
		"payment_time":  "2024-02-21 14:50:22",
		"org_no":        "123456",
		"result_state":  "SUCCESS",
	}

	// 解析通知消息
	notifyDto := clearingService.ParseNotify(notifyData)

	utils.Infof("通知消息解析成功！")
	utils.Infof("商户号：%s", notifyDto.MerchNo)
	utils.Infof("结算类型：%s", notifyDto.SettleType)
	utils.Infof("金额：%s", notifyDto.Amount)
	utils.Infof("手续费：%s", notifyDto.FeeAmount)
	utils.Infof("外部结算ID：%s", notifyDto.OutSettleID)
	utils.Infof("结算ID：%s", notifyDto.SettleID)
	utils.Infof("附言：%s", notifyDto.Postscript)
	utils.Infof("付款时间：%s", notifyDto.PaymentTime)
	utils.Infof("机构号：%s", notifyDto.OrgNo)
	utils.Infof("结果状态：%s", notifyDto.ResultState)
}

func main() {
	// 设置日志级别为info，显示详细的调试信息
	utils.SetLogLevel("info")

	utils.Info("=============================")
	utils.Info("===== 清算综合示例 开始 =====")
	utils.Info("=============================")

	// 创建配置对象和清算服务
	config := demo.CreateDemoConfig()
	clearingService := services.NewClearingService(config)

	utils.Info("")
	utils.Info("=============================")
	utils.Info("===== 提现查询示例 开始 =====")
	utils.Info("=============================")
	withdrawQueryDemo(clearingService)

	utils.Info("")
	utils.Info("=============================")
	utils.Info("===== 提现申请示例 开始 =====")
	utils.Info("=============================")
	withdrawApplyDemo(clearingService)

	utils.Info("")
	utils.Info("=============================")
	utils.Info("===== 结算资金查询示例 开始 =====")
	utils.Info("=============================")
	accBalanceQueryDemo(clearingService)

	utils.Info("")
	utils.Info("=============================")
	utils.Info("===== 通知消息解析示例 开始 =====")
	utils.Info("=============================")
	msgNotifyDemo(clearingService)

	utils.Info("")
	utils.Info("=============================")
	utils.Info("===== 清算综合示例执行完毕 =====")
	utils.Info("=============================")
}
